#!/bin/bash

# 体育场馆预约系统 - 后端启动脚本
# 作者: Claude Assistant
# 日期: 2025-06-27

echo "🚀 启动体育场馆预约系统后端服务..."

# 检查是否在项目根目录
if [ ! -f "run.py" ]; then
    echo "❌ 错误: 未找到 run.py 文件"
    echo "请确保在项目根目录运行此脚本"
    exit 1
fi

# 检查虚拟环境是否存在
if [ ! -d "venv" ]; then
    echo "❌ 错误: 未找到虚拟环境 venv"
    echo "请先创建虚拟环境: python3 -m venv venv"
    exit 1
fi

# 检查Python虚拟环境
if [ ! -f "venv/bin/python" ]; then
    echo "❌ 错误: 虚拟环境不完整"
    echo "请重新创建虚拟环境"
    exit 1
fi

# 激活虚拟环境
source venv/bin/activate

# 检查依赖是否安装
echo "🔍 检查Python依赖..."
if ! python -c "import flask" 2>/dev/null; then
    echo "📦 安装Python依赖..."
    pip install -r requirements.txt
    if [ $? -ne 0 ]; then
        echo "❌ 依赖安装失败"
        exit 1
    fi
fi

# 检查并处理端口占用
PORT=8080

# 函数：检查端口是否被占用
is_port_in_use() {
    local port=$1
    if command -v lsof >/dev/null 2>&1; then
        lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1
    else
        netstat -tlnp 2>/dev/null | grep ":$port " >/dev/null
    fi
}

# 函数：获取占用端口的进程ID
get_port_pids() {
    local port=$1
    if command -v lsof >/dev/null 2>&1; then
        lsof -ti:$port 2>/dev/null
    else
        netstat -tlnp 2>/dev/null | grep ":$port " | awk '{print $7}' | cut -d'/' -f1 | grep -v '^-$'
    fi
}

# 函数：清理端口
cleanup_port() {
    local port=$1
    echo "🧹 清理端口 $port..."
    
    # 首先尝试温和地终止我们的应用进程
    if [ -f "logs/backend.pid" ]; then
        local old_pid=$(cat logs/backend.pid)
        if ps -p $old_pid > /dev/null 2>&1; then
            echo "发现旧的后端进程 (PID: $old_pid)，正在终止..."
            kill $old_pid 2>/dev/null
            sleep 3
            if ps -p $old_pid > /dev/null 2>&1; then
                echo "强制终止进程..."
                kill -9 $old_pid 2>/dev/null
            fi
        fi
        rm -f logs/backend.pid
    fi
    
    # 检查端口是否仍被占用
    if is_port_in_use $port; then
        echo "端口 $port 仍被其他进程占用，正在强制清理..."
        local pids=$(get_port_pids $port)
        if [ -n "$pids" ]; then
            echo "终止占用端口的进程: $pids"
            for pid in $pids; do
                if [ "$pid" != "-" ] && [ -n "$pid" ]; then
                    kill -9 $pid 2>/dev/null
                fi
            done
            sleep 2
        fi
    fi
    
    # 最终检查
    if is_port_in_use $port; then
        echo "❌ 无法清理端口 $port，请手动检查占用进程"
        if command -v lsof >/dev/null 2>&1; then
            echo "查看占用进程: lsof -i :$port"
        else
            echo "查看占用进程: netstat -tlnp | grep :$port"
        fi
        exit 1
    else
        echo "✅ 端口 $port 已清理完成"
    fi
}

# 检查端口状态
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
    echo "⚠️  端口 $PORT 已被占用"
    
    # 检查是否是我们的应用进程且正常运行
    if [ -f "logs/backend.pid" ]; then
        local current_pid=$(cat logs/backend.pid)
        if ps -p $current_pid > /dev/null 2>&1 && ps aux | grep -v grep | grep "$current_pid.*python.*run.py" >/dev/null; then
            echo "✅ 发现健康的后端服务正在运行 (PID: $current_pid)"
            echo "📍 后端地址: http://0.0.0.0:$PORT"
            echo "📚 API文档: http://0.0.0.0:$PORT/apidocs/"
            echo "❤️ 健康检查: http://0.0.0.0:$PORT/health"
            echo "🌐 外网访问: https://dpcurdgwzmkg.sealosbja.site"
            echo ""
            echo "如需重启服务，请使用: ./stop_backend.sh && ./start_backend.sh"
            exit 0
        fi
    fi
    
    # 端口被占用但不是我们的健康进程，进行清理
    cleanup_port $PORT
else
    echo "✅ 端口 $PORT 可用"
    # 清理可能存在的僵尸PID文件
    if [ -f "logs/backend.pid" ]; then
        local old_pid=$(cat logs/backend.pid)
        if ! ps -p $old_pid > /dev/null 2>&1; then
            echo "清理无效的PID文件..."
            rm -f logs/backend.pid
        fi
    fi
fi

# 创建日志目录
mkdir -p logs

# 检查数据库连接
echo "🔍 检查数据库连接..."
if ! python -c "
import os
from dotenv import load_dotenv
load_dotenv()
print('数据库配置检查通过')
" 2>/dev/null; then
    echo "⚠️  警告: 数据库配置可能有问题"
    echo "请检查 .env 文件中的数据库配置"
fi

# 设置环境变量
export PORT=$PORT
export HOST=0.0.0.0
export FLASK_ENV=development

# 启动后端服务
echo "🌟 启动Flask后端服务..."
echo "📍 后端地址: http://0.0.0.0:$PORT"
echo "📚 API文档: http://0.0.0.0:$PORT/apidocs/"
echo "❤️ 健康检查: http://0.0.0.0:$PORT/health"
echo "🔑 管理员登录: admin / admin123"
echo ""

# 使用nohup在后台启动服务，并将输出重定向到日志文件
if [ "$1" = "daemon" ] || [ "$1" = "background" ]; then
    echo "🔄 以守护进程模式启动..."
    nohup python run.py > logs/backend.log 2>&1 &
    PID=$!
    echo $PID > logs/backend.pid
    echo "后端服务已启动，PID: $PID"
    echo "日志文件: $(pwd)/logs/backend.log"
    echo "PID文件: $(pwd)/logs/backend.pid"
    echo "查看日志: tail -f $(pwd)/logs/backend.log"
    
    # 等待几秒钟检查服务是否启动成功
    sleep 5
    
    # 检查进程是否存在
    if kill -0 $PID 2>/dev/null; then
        # 检查端口是否在监听
        if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
            echo "✅ 后端服务启动成功"
            echo "🌐 外网访问: https://dpcurdgwzmkg.sealosbja.site"
        else
            echo "⚠️  进程已启动但端口未监听，等待更多时间..."
            sleep 3
            if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
                echo "✅ 后端服务启动成功"
                echo "🌐 外网访问: https://dpcurdgwzmkg.sealosbja.site"
            else
                echo "❌ 后端服务启动失败，进程存在但端口未监听"
                echo "请查看日志文件: tail -f $(pwd)/logs/backend.log"
                rm -f logs/backend.pid
                exit 1
            fi
        fi
    else
        echo "❌ 后端服务启动失败，进程不存在"
        echo "请查看日志文件: tail -f $(pwd)/logs/backend.log"
        rm -f logs/backend.pid
        exit 1
    fi
else
    # 普通模式启动
    echo "按 Ctrl+C 停止服务"
    echo "================================================"
    python run.py
fi

echo ""
echo "🛑 后端服务已停止" 